<?php


require_once 'SC/SCanimal.php';
require_once 'SC/SCtypederace.php';
require_once 'SC/SCrace.php';
require_once 'SC/SCloge.php';
require_once 'SC/SCdeplacement.php';
require_once 'SC/SCracetoanimal.php';
require_once 'classes/Animal.php';
/**
 * Classe permettant de gérer les services fonctionnel manipulant des animaux 
 * @author Zikrija
 * @date 04.05.2012
 */
class SFanimal{


    /**
     * Méthode permettant d'ajouter un animal
     * @param Animal Un animal à ajouter
     * @param Race[] une liste d'objets Race de l'animal
     * @return Animal Un animal ajouté
     */
    public function ajouter(Animal $unAnimalAAjouter, $uneListeDeRace) {
        $unAnimalMemorise      = null;
        $SCanimal              = new SCanimal();
        $SCtypeDeRace          = new SCtypederace();
        $SCrace                = new SCrace();
        $SCracetoanimal        = new SCraceToAnimal();
        $uneListeDeRacesValide = null;

        // Vérifie l'existance du type d'animal
        $unTypeDeRaceValide = $SCtypeDeRace->lister(new TypeDeRace($unAnimalAAjouter->getTypeDeRace_nom()));
        if($unTypeDeRaceValide['0']){
            // Pour chaque race de l'animal
            foreach($uneListeDeRace as $uneRace){
                $uneRaceValide = $SCrace->lister(new Race($uneRace->getNom(), $uneRace->getTypeDeRace_nom()));
                if($uneRaceValide['0']){
                    // Vérifie la cohérence entre le type de l'animal et sa race
                    if($uneRaceValide['0']->getTypeDeRace_nom() == $unTypeDeRaceValide['0']->getNom()){
                        $uneListeDeRacesValide[] = $uneRaceValide['0'];
                    }
                }
            }
            if($uneListeDeRacesValide){
                // Vérifie l'inexistance du numéro de la puce
                $unePuceExistante = $SCanimal->lister(new Animal(null, $unAnimalAAjouter->getPuceNo(), null, null, null, null, null, null, null, null, null, null, null, null, null));
                if($unePuceExistante['0'] == null || $unAnimalAAjouter->getPuceNo() == null){
                    // Vérifie que la date de naissance soit antérieure à la date de décès
                    $longDateNaissance = mktime(0, 0, 0, date('m', strtotime($unAnimalAAjouter->getDateNaissance())), date('d', strtotime($unAnimalAAjouter->getDateNaissance())), date('Y', strtotime($unAnimalAAjouter->getDateNaissance())));
                    $longDateDeces     = mktime(0, 0, 0, date('m', strtotime($unAnimalAAjouter->getDateDeces())), date('d', strtotime($unAnimalAAjouter->getDateDeces())), date('Y', strtotime($unAnimalAAjouter->getDateDeces())));
                    if($longDateDeces - $longDateNaissance >= 0){
                        // Mémorise l'animal
                        $unAnimalMemorise = $SCanimal->ajouter($unAnimalAAjouter);
                        // Pour chaque race valide
                        foreach($uneListeDeRacesValide as $uneRaceValide){
                            // Crée l'association 'est de' entre Animal et Race
                            $SCracetoanimal->ajouter(new RaceToAnimal($unAnimalMemorise->getId() , $uneRaceValide->getNom(), $unTypeDeRaceValide['0']->getNom()));
                        }
                        $unAnimalMemorise = $unAnimalAAjouter;
                    }
                }
            }
        }
        return $unAnimalMemorise;
    }

    /**
     * Méthode permettant de modifier un animal
     * @param Animal Un animal à modifier
     * @param Race[] une liste d'objets Race de l'animal
     * @return Animal Un animal modifié
     */
    public function modifier($unAnimalAModifier, $uneListeDeRace) {
        $unAnimalModifie       = null;
        $SCanimal              = new SCanimal();
        $SCtypeDeRace          = new SCtypederace();
        $SCrace                = new SCrace();
        $SCracetoanimal        = new SCraceToAnimal();
        $uneListeDeRacesValide = null;
        
        // Vérifie l'existance de l'animal
        if($SCanimal->lister(new Animal($unAnimalAModifier->getId(), null, null, null, null, null, null, null, null, null, null, null, null, null, null))){
            // Vérifie l'existance du type d'animal
            $unTypeDeRaceValide = $SCtypeDeRace->lister(new TypeDeRace($unAnimalAModifier->getTypeDeRace_nom()));
            if($unTypeDeRaceValide['0']){
                // Pour chaque race de l'animal
                foreach($uneListeDeRace as $uneRace){
                    $uneRaceValide = $SCrace->lister(new Race($uneRace->getNom(), $uneRace->getTypeDeRace_nom()));
                    if($uneRaceValide['0']){
                        // Vérifie la cohérence entre le type de l'animal et sa race
                        if($uneRaceValide['0']->getTypeDeRace_nom() == $unTypeDeRaceValide['0']->getNom()){
                            $uneListeDeRacesValide[] = $uneRaceValide['0'];
                        }
                    }
                }
                if($uneListeDeRacesValide){
                    // Vérifie l'inexistance du numéro de la puce
                    $unePuceExistante = $SCanimal->lister(new Animal(null, $unAnimalAModifier->getPuceNo(), null, null, null, null, null, null, null, null, null, null, null, null, null));
                    if($unePuceExistante['0'] == null || $unAnimalAModifier->getPuceNo() == null){
                        // Vérifie que la date de naissance soit antérieure à la date de décès
                        $longDateNaissance = mktime(0, 0, 0, date('m', strtotime($unAnimalAModifier->getDateNaissance())), date('d', strtotime($unAnimalAModifier->getDateNaissance())), date('Y', strtotime($unAnimalAModifier->getDateNaissance())));
                        $longDateDeces     = mktime(0, 0, 0, date('m', strtotime($unAnimalAModifier->getDateDeces())), date('d', strtotime($unAnimalAModifier->getDateDeces())), date('Y', strtotime($unAnimalAModifier->getDateDeces())));
                        if($longDateDeces - $longDateNaissance >= 0){
                            // Modification l'animal
                            $unAnimalMemorise = $SCanimal->modifier($unAnimalAModifier);

                            // Suppression de toutes les races de l'animal
                            $listeRacesASupprimer = $SCracetoanimal->lister(new RaceToAnimal($unAnimalAModifier->getId(), null, null));
                            foreach($listeRacesASupprimer as $uneRaceASupprimer){
                                $SCracetoanimal->supprimer($uneRaceASupprimer);
                            }
                            
                            // Pour chaque race valide
                            foreach($uneListeDeRacesValide as $uneRaceValide){
                                // Crée l'association 'est de' entre Animal et Race
                                $SCracetoanimal->ajouter(new RaceToAnimal($unAnimalMemorise->getId() , $uneRaceValide->getNom(), $unTypeDeRaceValide['0']->getNom()));
                            }
                            $unAnimalMemorise = $unAnimalAModifier;
                        }
                    }
                }
            } 
        }
        return $unAnimalMemorise;
    }

    /**
     * TODO: Supprime un animal
     * @param int identifiant de l'animal à supprimer
     * @return Boolean True si l'animal a été supprimé, False sinon
     */
    public function supprimer($idAnimalASupprimer) {
        return false;
    }
    
    /**
     * Méthode permettant de lister les animaux
     * @param Animal Objet animal contenant les critères de sélection
     * @return Animal[] Une liste d'animaux correspondant aux critères de sélection
     */
    public function lister($animalARechercher) {
        $SCanimal = new SCanimal();
        return $listAnimaux = $SCanimal->lister($animalARechercher);
    }
    
    /**
     * Méthode permettant de lister les animaux
     * @param Animal Objet animal contenant les critères de sélection
     * @return Animal[] Une liste d'animaux correspondant aux critères de sélection
     */
    public function listerAvecRace($animalARechercher, $race) {
        $SCanimal = new SCanimal();
        $SCraceToAnimal = new SCrace();
        
        return $listAnimaux = $SCanimal->listerAvecRace($animalARechercher, $race);
    }
    
    /**
     * Service fonctionnel permettant de lister les races d'un animal
     * @param Animal Animal dont on cherche les races
     * @return RaceToAnimal[] liste des races d'un animal 
     */
    public function listerRace(Animal $animalARechercher) {
        $SCraceToAnimal = new SCraceToAnimal();
        
        return $listRaces = $SCraceToAnimal->lister(new RaceToAnimal($animalARechercher->getId(), null , null));
    }

}

?>
